using TerritoryGame.Domain.Interfaces;
using TerritoryGame.Domain.DomainEvents;
using TerritoryGame.Application.Interfaces;
using TerritoryGame.Domain.Entities.App;

namespace TerritoryGame.Application.Services;

/// <summary>
/// 用户注册事件处理器（Application层）
/// </summary>
public class UserRegisteredEventHandler : IDomainEventHandler<UserRegisteredEvent>
{
    private readonly IAppLogService _logService;

    public UserRegisteredEventHandler(IAppLogService logService)
    {
        _logService = logService;
    }

    public async Task HandleAsync(UserRegisteredEvent domainEvent)
    {
        try
        {
            // 记录用户注册日志
            _logService.LogInformation(
                $"用户注册成功: {domainEvent.User.Username} (客户端: {domainEvent.ClientType})"
            );

            // 等级记录的创建已在注册流程中完成，事件处理器仅负责记录与后续扩展
            await Task.CompletedTask;
        }
        catch (Exception ex)
        {
            _logService.LogError(
                $"处理用户注册事件时发生错误: {ex.Message}"
            );
            // 注意：这里不抛出异常，避免影响用户注册流程
        }
    }
}

/// <summary>
/// 用户登录事件处理器（Application层）
/// </summary>
public class UserLoggedInEventHandler : IDomainEventHandler<UserLoggedInEvent>
{
    private readonly IAppLogService _logService;

    public UserLoggedInEventHandler(IAppLogService logService)
    {
        _logService = logService;
    }

    public async Task HandleAsync(UserLoggedInEvent domainEvent)
    {
        // 记录用户登录日志
        _logService.LogInformation(
            $"用户登录成功: {domainEvent.User.Username} (客户端: {domainEvent.ClientType}, IP: {domainEvent.IpAddress})"
        );

        // 可以在这里添加其他业务逻辑，比如：
        // - 更新用户最后登录时间
        // - 记录用户登录历史
        // - 发送登录通知
        // - 安全检查（异常登录检测）
        
        await Task.CompletedTask;
    }
}

/// <summary>
/// 用户登录失败事件处理器（Application层）
/// </summary>
public class UserLoginFailedEventHandler : IDomainEventHandler<UserLoginFailedEvent>
{
    private readonly IAppLogService _logService;

    public UserLoginFailedEventHandler(IAppLogService logService)
    {
        _logService = logService;
    }

    public async Task HandleAsync(UserLoginFailedEvent domainEvent)
    {
        // 记录登录失败日志
        _logService.LogWarning(
            $"用户登录失败: {domainEvent.Username} (原因: {domainEvent.Reason}, IP: {domainEvent.IpAddress}, 失败次数: {domainEvent.FailedAttempts})"
        );

        // 可以在这里添加其他业务逻辑，比如：
        // - 安全检查（暴力破解检测）
        // - 发送安全警告邮件
        // - 记录安全事件
        // - 触发账户锁定逻辑
        
        await Task.CompletedTask;
    }
} 